import Vue from 'vue'
import moment from 'moment'
import { timestampFormatDate } from '@/lib/FormatTime'
import { post } from '@/lib/Util'
import { sendMsg, getDB } from '@/lib/GetDB'
Vue.filter('testFilter', (data, p1, p2) => {
  return data + 'filter'
})
Vue.filter('fixTimeBack', (data, p1, p2) => {
  console.log(data, 'datataaaaaaaaaaaaaa')
  if (data !== undefined && data != null && data !== '') {
    const val =
      data.substring(0, 4) +
      '-' +
      data.substring(4, 6) +
      '-' +
      data.substring(6, 8) +
      ' ' +
      data.substring(8, 10) +
      ':' +
      data.substring(10, 12) +
      ':' +
      data.substring(12)
    return moment(val).format(p1)
  } else {
    return ''
  }
})
Vue.filter('testFilter', (data, p1, p2) => {
  return data + 'filter'
})
Vue.filter('cutZiFu', (data, p1, p2) => {
  console.log(typeof data, 'typeof data')
  /* if (typeof data === 'string') {
    data = data.replace(new RegExp(p1, 'g'), '')
    data = data.replace(new RegExp(p2, 'g'), '')
  }*/
  return data
})

Vue.filter('subTime2', data => {
  let d = ''
  if (data != null && data !== '') {
    d = data.substring(0, 19)
  }
  return d
})
Vue.filter('subTime', data => {
  let d = ''
  if (data != null && data !== '') {
    d = data.substring(0, 24)
  }
  return d
})
Vue.filter('timestampFormatDate', (data, p1, p2) => {
  const d = timestampFormatDate(data, p1)
  return d
})
Vue.filter('numToFiexed', (data, p1 = 2, p2) => {
  if (isNaN(Number(data))) {
    var reg = /^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\s+(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d.[0-9][0-9][0-9]$/

    var isDate = reg.test(data)
    if (isDate) {
      return data.split('.')[0]
    }
    return data
  } else {
    if (Number(data) % 1 === 0) {
      return data
    }

    if (Math.abs(data) < 0.1) {
      return Number(data).toFixed(4)
    }
    return Number(data).toFixed(p1)
  }
})
Vue.filter('numToFiexed1', (data, p1 = 2, p2) => {
  if (isNaN(Number(data))) {
    var reg = /^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\s+(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d.[0-9][0-9][0-9]$/

    var isDate = reg.test(data)
    if (isDate) {
      return data.split('.')[0]
    }
    return data
  } else {
    if (Number(data) % 1 === 0) {
      return data
    }

    if (Math.abs(data) < 0.1) {
      return Number(Number(data).toFixed(4))
    }
    return Number(data).toFixed(p1)
  }
})
Vue.filter('handleNum', data => {
  var reg = /^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\s+(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d.000$/
  var isDate = reg.test(data)
  if (isDate) {
    return data.split('.')[0]
  }

  if (typeof data === 'number' && (data + '').length >= 10) {
    data = Number(data.toFixed(6))
  }
  return data
})
// 公共函数
Vue.use({
  install(Vue) {
    Vue.prototype.comsys = {
      // 表格序号
      tableRowIndex: function($index, currentPage, pageSize) {
        return (currentPage - 1) * pageSize + $index + 1
      },
      // 表格斑马线效果
      tabRowClassName: function({ row, rowIndex }) {
        const index = rowIndex + 1
        if (index % 2 === 0) {
          return 'light-row'
        } else {
          return 'dack-row'
        }
      },
      // 表格自适应宽度
      flexColumnWidth(str, tableData, flag, headData) {
        // str为该列的字段名(传字符串);tableData为该表格的数据源(传变量);
        // flag为可选值，可不传该参数,传参时可选'max'或'equal',默认为'max'
        // flag为'max'则设置列宽适配该列中最长的内容,flag为'equal'则设置列宽适配该列中第一行内容的长度。
        str = str + ''
        let columnContent = ''
        if (
          !tableData ||
          !tableData.length ||
          tableData.length === 0 ||
          tableData === undefined
        ) {
          return
        }
        if (!str || !str.length || str.length === 0 || str === undefined) {
          return
        }
        if (flag === 'equal') {
          // 获取该列中第一个不为空的数据(内容)
          for (let i = 0; i < tableData.length; i++) {
            if (tableData[i][str].length > 0) {
              columnContent = tableData[i][str] + ''
              break
            }
          }
        } else {
          // 获取该列中最长的数据(内容)
          let index = 0
          for (let i = 0; i < tableData.length; i++) {
            if (tableData[i][str] === null) {
              // 当数据为空时跳过本次循环获取下一条数据长度
              continue
            }
            const now_temp = tableData[i][str] + ''
            const max_temp = tableData[index][str] + ''
            if (now_temp.length > max_temp.length) {
              index = i
            }
          }
          columnContent = tableData[index][str] + ''
        }
        // 以下分配的单位长度可根据实际需求进行调整
        let flexWidth = 20
        if (columnContent !== undefined) {
          if (
            !isNaN(Number(columnContent)) &&
            columnContent.indexOf('.') > -1
          ) {
            if (columnContent.split('.')[1].length > 4) {
              columnContent = Number(columnContent).toFixed(2) + ''
            }
          }
          for (const char of columnContent) {
            if ((char >= 'A' && char <= 'Z') || (char >= 'a' && char <= 'z')) {
              // 如果是英文字符，为字符分配10个单位宽度
              flexWidth += 10
            } else if (char >= '\u4e00' && char <= '\u9fa5') {
              // 如果是中文字符，为字符分配16个单位宽度
              flexWidth += 16
            } else if (!isNaN(Number(char))) {
              // 如果是中文字符，为字符分配16个单位宽度
              flexWidth += 8
            } else if (
              char === '' ||
              char === '.' ||
              char === '-' ||
              char === ':'
            ) {
              // 如果是中文字符，为字符分配16个单位宽度
              flexWidth += 3
            } else {
              // 其他种类字符，为字符分配10个单位宽度
              flexWidth += 10
            }
          }
        }
        let flexWidthHeadData = 20
        if (headData !== undefined) {
          for (const char of headData) {
            if ((char >= 'A' && char <= 'Z') || (char >= 'a' && char <= 'z')) {
              // 如果是英文字符，为字符分配10个单位宽度
              flexWidthHeadData += 10
            } else if (char >= '\u4e00' && char <= '\u9fa5') {
              // 如果是中文字符，为字符分配16个单位宽度
              flexWidthHeadData += 15
            } else if (!isNaN(Number(char))) {
              // 如果是中文字符，为字符分配16个单位宽度
              flexWidthHeadData += 8
            } else if (
              char === '' ||
              char === '.' ||
              char === '-' ||
              char === ':'
            ) {
              // 如果是中文字符，为字符分配16个单位宽度
              flexWidthHeadData += 3
            } else {
              // 其他种类字符，为字符分配10个单位宽度
              flexWidthHeadData += 10
            }
          }
        }
        if (flexWidthHeadData > flexWidth) {
          flexWidth = flexWidthHeadData
        }
        if (flexWidth < 80) {
          // 设置最小宽度
          flexWidth = 70
        }
        if (flexWidth > 500) {
          // 设置最大宽度
          flexWidth = 500
        }
        return flexWidth + 'px'
      },
      // 根据json数据，下载为json文件
      downJsonFile: function(jsonData, name) {
        var data = JSON.stringify(jsonData, null, '\t')
        if (data.length <= 2) {
          Vue.prototype.$message({
            message: '检测到json数据为空！',
            type: 'warning'
          })
          return 0
        }
        // encodeURIComponent解决中文乱码
        const uri = 'data:text/csv;charset=utf-8,' + encodeURIComponent(data)
        // 通过创建a标签实现
        const link = document.createElement('a')
        link.href = uri
        // 对下载的文件命名
        link.download = name + '.json'
        document.body.appendChild(link)
        link.click()
        document.body.removeChild(link)
        return 1
      },
      // 保存数据到mongodb
      saveToMongodb: async function(
        data,
        modelType,
        task_type,
        multi_task = false,
        modelCode = 1111
      ) {
        const newData = {
          simul_id: data.info.simul_id,
          multi_task: multi_task,
          task_type: task_type,
          input: data.data
          // info: data.info
        }
        getDB(
          {
            module: 'MdbService',
            method: 'MdbService',
            request: {
              type: 'insert',
              db: 'ustb',
              coll: 'sim_hsm',
              doc: [newData]
            },
            record: false
          },
          resD => {
            if (resD.code === 200) {
              /* Vue.prototype.$message({
                type: 'success',
                message: data.msg
              })*/
              this.insertSummary(data, modelType, modelCode)
            } else {
              Vue.prototype.$message.error('提交出错，请联系管理员！')
            }
          },
          error => {
            Vue.prototype.$message.error('提交出错，请联系管理员！')
            console.log(error, 'aaaaaaaaaaa')
          }
        )
        /* const res = await post('/mppHsm/simulInput', data)
        console.log(res)
        Vue.prototype.$message({
          type: 'success',
          message: res.msg
        })*/
        // 发送消息到指定模型
        /* const postData = {
          'msgId': 1009,
          'sendTo': modelType,
          'waitReply': true,
          'timeout': 10,
          'params': {
            simul_id: data.info.simulId
          },
          recSize: 128
        }
        sendMsg(
          postData,
          data => {
            /!* if (data.code === 200 && data.results[0][0].status === 1) {
              this.$message({
                message: '测试成功',
                type: 'success'
              })
            } else {
              this.$message.error('请检查sql语句及数据库名称是否正确，若无问题，请联系管理员！')
            }*!/
          },
          error => {
            console.log(error, 'aaaaaaaaaaa')
          }
        )*/
        // var result = await sendMsg([[{ a: 1 }]], 1009, modelType)
        // console.log(result)
      },
      // 发送消息
      sendMsgToProcess: async function(simul_id, modelType, modelCode = 1111) {
        console.log(new Date().getTime(), 'sendMsgToProcess=============')
        // 发送消息到指定模型
        const postData = {
          msgId: modelCode,
          sendTo: modelType,
          waitReply: true,
          timeout: 10,
          recSize: 128,
          params: {
            simul_id: simul_id
          }
        }
        if (modelType === 'FurSlabTemp' || modelType === 'CsTemp') {
          postData.params = { simul_id: simul_id }
          postData.recSize = 128
        }
        sendMsg(
          postData,
          data => {
            if (data.code === 200) {
              Vue.prototype.$message({
                message: '提交成功',
                type: 'success'
              })
            } else {
              Vue.prototype.$message.error('提交失败，请重新提交或联系管理员！')
              this.deleteSummary(simul_id)
            }
          },
          error => {
            console.log(error, 'aaaaaaaaaaa')
            Vue.prototype.$message.error('提交失败，请重新提交或联系管理员！')
            this.deleteSummary(simul_id)
          }
        )
      },
      // 插入mysql数据库摘要
      insertSummary: async function(data, modelType, modelCode) {
        const apiUrl = Vue.prototype.urlApi.simulMangerInsert
        const res = await post(apiUrl, data.info)
        if (res === undefined) {
          return false
        }
        console.log(data, apiUrl, res, '==========ddd')
        /* if (res.code !== 200 || res.code !== 2000) {
          Vue.prototype.$message.error('插入摘要失败，请重新提交或联系管理员！')
          return false
        }*/
        this.sendMsgToProcess(data.info.simul_id, modelType, modelCode)
      },
      // 删除mysql摘要
      deleteSummary: async function(simul_id) {
        const apiUrl = Vue.prototype.urlApi.simulMangerDelete
        const res = await post(apiUrl, { simul_id: simul_id })
        if (res === undefined) {
          return false
        }
        console.log(
          simul_id,
          Vue.prototype.urlApi.simulMangerDelete,
          res,
          '==========ddd'
        )
      }
    }
  }
})
